/**
 * Created with IntelliJ IDEA.
 * Description :
 * User: $ {USER}
 * Date: $ {YEAR}-$ {MONTH}一$ { DAY}
 * Time: ${ TIME}
 */
/**
 * 状态：
 * 今天是2024年5月16日
 * 开始了大学的第一个正式的flag：和三叶姐一起 刷穿LeetCode
 * LeetCode刷题——罗马数字转整数
 *
 * 思路：
 * 本题比较简单，根据题目给出的规则来直接遍历整个字符串（字符数组），根据给出的规则直接相加即可
 *
 * 自己写出来的代码比较繁琐，不必转化为字符数组，可以直接通过下标找到对应的字符
 *
 * 多种思路：
 * 1. 直接把第一个字符转换为对应的数值，再通过遍历得到后面的数值，接着就是比较两者的大小
 *    如果前面大，那么就是加；如果前面小，那么就是减，直至遍历到最后一个字符（无需比较）
 *    根据得到的字符，通过自己写的方法转化为对应的数值
 *
 *
 * 小知识点：1. 当Switch语句，某一个case包含了return语句，那么这个Switch语句中一定要包含default语句，
 *            并且这个default语句一定要包含有return语句。但是其他的case语句中可以不包含return语句。
 *         2. 在某一个case语句中定义的变量可以在其后面的case语句中使用。
 */
public class Test {
    public static int func(char[] ch, int n) {
        int ret = 1;
        // 下面的判断条件易错，不是根据字符的大小进行判断的，而是要根据罗马数字进行判断
        if (n < ch.length-1 && func2(ch,n) < func2(ch,n+1)) {
            ret = -ret;
        }
        return ret;
    }

    // 根据传入参数来输出其大小
    public static int func2(char[] ch, int n) {
        switch (ch[n]) {
            case 'I':
                return 1;
            case 'V':
                return 5;
            case 'X':
                return 10;
            case 'L':
                return 50;
            case 'C':
                return 100;
            case 'D':
                return 500;
            case 'M':
                return 1000;
            default:
                return 0;
        }
    }

    public static int romanToInt(String s) {
        // 把字符串转换为一个一个的字符
        char[] ch = s.toCharArray();
        int n = 0;
        int sum = 0;
        // 再根据是什么字符来决定加多少或者减多少
        while (n < ch.length) {
            switch (ch[n]) {
                case 'I':
                    int ret = func(ch, n);
                    sum += ret*1;
                    break;
                case 'V':
                    ret = func(ch, n);
                    sum += ret*5;
                    break;
                case 'X':
                    ret = func(ch, n);
                    sum += ret*10;
                    break;
                case 'L':
                    ret = func(ch, n);
                    sum += ret*50;
                    break;
                case 'C':
                    ret = func(ch, n);
                    sum += ret*100;
                    break;
                case 'D':
                    ret = func(ch, n);
                    sum += ret*500;
                    break;
                case 'M':
                    ret = func(ch, n);
                    sum += ret*1000;
                    break;
            }
            n++;
        }
        return sum;
    }

    public static void main(String[] args) {
        System.out.println(romanToInt("LVIII"));
    }
}
